home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d886.lha / TextPort / source / StripCR.c < prev    next >
C/C++ Source or Header  |  1993-07-16  |  3KB  |  87 lines

  1. /*----------------------------------------------------------+
  2.  | stripcr.c -- 5/15/1992 public domain                     |
  3.  |           by Alex Matulich, Unicorn Research Corporation |
  4.  | Strip CR characters from a text file, leaving only LF's. |
  5.  +----------------------------------------------------------*/
  6. #define OUTBUFSIZ 16384
  7.                                                 
  8. #include <stdio.h>
  9. #include <stdlib.h>  /* for malloc() */
  10. #define CR '\x0D'
  11.  
  12. unsigned short replace, bufptr = 0;
  13. signed char *buf = NULL;
  14. FILE *infile, *outfile;
  15. long inpos = 0L, outpos = 0L;       /* file position trackers */
  16.  
  17. int writebuf(void);
  18.  
  19. void main(int argc, char *argv[])
  20. {
  21. unsigned short err = 0;
  22. signed char ch;
  23.  
  24. if (argc != 3 && argc != 2) {
  25.    fputs("StripCR by Unicorn Research Corporation\nStrip CR characters from text files that use the CR+LF combination.\n\nUsage:  StripCR infile [outfile]\n\nIf outfile is omitted, then infile will be replaced.\n", stdout);
  26.    return;
  27.    }
  28. if((infile = fopen( argv[1], (replace = (argc == 2)) ? "rb+" : "rb" )) == NULL) {
  29.    fputs("Could not open input file.\n", stdout);
  30.    return;
  31.    }
  32. if (replace)
  33.    outfile = infile;
  34. else if ((outfile = fopen( argv[2], "wb" )) == NULL) {
  35.    fputs("Could not open output file.\n", stdout);
  36.    fclose(infile);
  37.    return;
  38.    }
  39. if ((buf = (signed char *)malloc(OUTBUFSIZ)) == NULL) {
  40.    fputs("Not enough memory!\n", stdout);
  41.    goto cleanup;
  42.    }
  43.  
  44. while ((ch = fgetc(infile)) != EOF) {
  45.    ++inpos;          /* position of next character in input file */
  46.    if (ch != CR) {
  47.       buf[bufptr++] = ch;
  48.       if (bufptr == OUTBUFSIZ) if (err = writebuf()) break;
  49.       }
  50.    }
  51.  
  52. if (!err && bufptr) err = writebuf();
  53. if (err == 1)
  54.    fputs("Error writing output file.\n", stdout);
  55. else if (err == 2)
  56.    fputs("Error reading input file.\n", stdout);
  57. else if (replace) {
  58.    fseek(outfile, outpos, 0);
  59.    fputc('\x1A', outfile);  /* output a ctrl-Z */
  60.    fputs(argv[1], stdout);
  61.    fputs(" is now stripped of CR's.\nDelete all text past the ctrl-Z character.\n", stdout);
  62.    }
  63. else {
  64.    fputs("Stripped file ", stdout);
  65.    fputs(argv[2], stdout);
  66.    fputs(" successfully created.\n", stdout);
  67.    }
  68. cleanup:
  69. free(buf);
  70. fclose(infile);
  71. if (!replace) fclose(outfile);
  72. }
  73.  
  74.  
  75. /* write the buffer to the output file, when full or when done */
  76. int writebuf()
  77. {
  78. unsigned short i = 0;
  79. if (replace) if (fseek(outfile, outpos, 0)) return 1;
  80. while (i < bufptr)
  81.    if (fputc(buf[i++], outfile) == EOF) return 1;
  82. outpos += bufptr;
  83. if (replace) if (fseek(infile, inpos, 0)) return 2;
  84. bufptr = 0;
  85. return 0;
  86. }
  87.